package com.mzz.creational.singleton;

/**
 * (1)
 *
 * @describe 这种方式是最基本的实现方式，这种实现最大的问题就是不支持多线程。
 * <p>
 * 因为没有加锁 synchronized，所以严格意义上它并不算单例模式。
 * <p>
 * 使用了懒加载（ lazy loading ）模式（延迟加载），但是却存在致命的问题。
 * <p>
 * 当有多个线程并行调用 getInstance() 的时候，就会创建多个实例。 @@@
 * <p>
 * 也就是说在多线程下不能正常工作。
 * <p>
 * 项目实例：无
 */
public class SingletonNoConcurrent1 {

    /**
     * 持有私有静态实例，防止被引用，此处赋值为null，目的是实现延迟加载
     */
    private static SingletonNoConcurrent1 instance = null;

    /**
     * 私有静态方法，防止被实例化
     */
    private SingletonNoConcurrent1() {
    }

    //使用该类的时候被初始化

    /**
     * 静态工程方法，创建实例
     */
    public static SingletonNoConcurrent1 getInstance() {
        if (instance == null) {
            instance = new SingletonNoConcurrent1();
        }
        return instance;
    }

    //当JVM从内存中反序列化地“组装”对象时，就会自动调用这个readResolve()方法来返回我们制定好的对象。

    /**
     * 如果该对象被用于序列化，可以保证对象在序列化前后保持一致
     */
    public Object readResolve() {
        return instance;
    }

    /**
     * 这个类可以满足基本要求，但是，像这样毫无线程安全保护的类，如果我们把它放入多线程的环境下，肯定就会出现问题了，如何解决？
     *
     * 我们首先会想到对getInstance方法加synchronized关键字，改动后的代码请点击查看 SingletonSynchronize2.java
     */


}
